package com.augurit.common.system.service.org;

import java.util.List;

import org.springside.modules.orm.Page;

import com.augurit.common.base.form.ResultForm;
import com.augurit.common.base.service.IBaseService;
import com.augurit.common.system.web.org.form.OmOrgForm;
import com.augurit.common.system.web.org.form.OmPositionForm;
import com.augurit.common.system.web.org.form.OmUserForm;


/**
 * 岗位接口
 */
public interface IOmPositionService extends IBaseService<OmPositionForm, Long> {	
	
	public List<OmPositionForm> getPositionsByCodeList(List<String> posCodeList);
	
	/**
	 * 根据机构ID查询下级岗位
	 * @param OrgId 机构id
	 * @return 机构ID查询下级岗位对象主键的集合
	 */
	public List<Long> getPositionIdsByOrgId(Long orgId);
	
	/**
	 * 根据工作组主键查询直属下级岗位
	 * @param groupId 工作组主键
	 * @return 工作组主键查询下级岗位对象主键的集合
	 */
	public List<Long> getPositionIdsByGroupId(Long groupId);
	
	/**
	 * 根据机构ID查询下级岗位
	 * @param OrgId 机构id
	 * @return 机构ID查询下级岗位对象集合
	 */
	public List<OmPositionForm> getPositionsByOrgId(Long orgId);
	
	/**
	 * 根据工作组id查询下级岗位
	 * @author 王剑文
	 * @param groupId 工作组id
	 * @return 机构ID查询下级岗位对象集合
	 */
	public List<OmPositionForm> getPositionsByGroupId(Long groupId);
	
	/**
	 * 根据机构ID删除下级岗位
	 * @param OrgId 机构id
	 */
	public void deletePosCascade(Long orgId);
	
	/**
	 * 根据机构ID查询下级岗位以及下级岗位的子岗位
	 * @param OrgId 机构id
	 * @return 机构ID查询下级岗位对象集合
	 */
	public List<OmPositionForm> getAllPositionsByOrgId(Long orgId);
	
	
	/**
	 * 分页获取指定机构的直属岗位列表
	 * @param orgId
	 * @return
	 */
	public Page<OmPositionForm> getPositionsByOrgId(Long orgId, Page<OmPositionForm> page);
	
	/**
	 * 分页获取指定工作组的直属岗位列表
	 * @param groupId 工作组id
	 * @return
	 */
	public Page<OmPositionForm> getPositionsByGroup(Long groupId, Page<OmPositionForm> page);
	
	
	/**
	 * 移动岗位到另一机构节点下
	 * @param posId 岗位ID
	 * @param  targetOrgId 用户所要移到的机构ID
	 */
	public void movePositionToOrg(Long posId, Long targetOrgId);
	
	
	/**
	 * 移动岗位到新父岗位节点下
	 * @param posId 岗位ID
	 * @param  newParentPosId 用户所要移到的新父岗位ID
	 */
	public void movePosition(Long posId, Long targetParentPosId);
	
	/**
	 * 为岗位装载用户
	 * @param form 岗位对象
	 * */
	public void loadUsers(OmPositionForm form);
	
	/**
	 *为岗位list列表装载关联用户
	 *@param list 岗位列表
	 * */
	public void loadUsers(List<OmPositionForm> list);
	
	/**
	 * 删除岗位以及所有子岗位，关联的用户
	 * @param posId 岗位主键
	 */
	public void deletePosition(Long posId);
	
	/**
	 * 根据主键ID通过岗位序列posSeq模糊查询所有的子岗位
	 * @param id 业务字典项对象主键
	 * @return 业务字典项对象的集合
	 */
	public List<OmPositionForm> getAllChildPositions(Long parentPosId);
	
	/**
	 * 根据主键ID查询直属子岗位
	 * @param id 业务字典项对象主键
	 * @return 业务字典项对象主键的集合
	 */
	public List<Long> getChildPositionIds(Long id);
	
	/**
	 * 根据主键ID查询直属子岗位
	 * @param parentPosId 业务字典项对象主键
	 * @return 业务字典项对象主键的集合
	 */
	public List<OmPositionForm> getChildPositions(Long parentPosId);


	/**
	 * 查询以组织id为partyId的所有岗位所关联的用户主键
	 * @param partyId 组织id
	 * @param posType 组织类型
	 * @return 用户主键列表
	 * */
	public List<Long> getHavePositionUsers(Long partyId, String posType);
	
	/**
	 * 根据岗位主键获取关联用户列表
	 * @param posId 岗位主键
	 * @return 岗位关联的用户列表
	 */
	public List<OmUserForm> getUsersByPosId(Long posId);
	
	/**
	 * 获取指定用户的岗位ID集合
	 * @param userId
	 * @return
	 */
	public List<Long> getPositionIds(Long userId);
	
	/**************************带userId参数的方法*********************/

	public boolean canManagePosition(Long adminUserId, Long... posIds);
	
	public ResultForm<OmPositionForm> get(Long adminUserId, Long posId);
	
	public ResultForm<Object> save(Long adminUserId, OmPositionForm... forms);
	
	public ResultForm<Object> delete(Long adminUserId, Long... posIds);

	/**
	 * 根据机构id级联删除关联的岗位，根据用户权限先判断是否有权限删除
	 * @param userId 用户主键
	 * @param orgId  机构主键
	 * @return 是否成功删除的提示信息
	 * */
	public ResultForm<Object> deletePosCascade(Long adminUserId, Long orgId);
	
	
	/**
	 * 根据岗位获取关联用户列表，先判断管理用户是否拥有管理权限,
	 * 若有权限，返回关联用户列表和执行成功的信息；否则，返回失败信息
	 * @param adminUserId 管理用户主键
	 * @param posId 岗位主键
	 * @return 
	 * */
	public ResultForm<List<OmUserForm>> getUsersByPosId(Long adminUserId, Long posId);
	
	/**
	 * 根据机构id获取关联的岗位，根据用户权限先判断是否有权限查询
	 * @param userId 用户主键
	 * @param orgId  机构主键
	 * @return 是否成功获取岗位的提示信息
	 * */
	public ResultForm<List<OmPositionForm>> getPositions(Long adminUserId, Long orgId);
	
	
	/**
	 * 根据机构id获取关联的所有岗位，先要判断管理用户是否拥有该机构的管理权限
	 * @param adminUserId 管理用户主键
	 * @param orgId 机构主键
	 * @return 是否成功执行查询的信息
	 * */
	public ResultForm<List<OmPositionForm>> getAllPositions(Long adminUserId, Long orgId);
	
	
	/**
	 * 移动岗位到目标父岗位，根据用户权限先判断是否有权限删除该岗位，
	 * 以及是否有权限在目标父岗位下增加一岗位
	 * @param userId 用户主键
	 * @param posId  岗位主键
	 * @param targetParentPosId 要移动到的目标父岗位
	 * @return 是否成功移动岗位的提示信息
	 * */
	public ResultForm<Object> movePosition(Long adminUserId, Long posId, Long targetParentPosId);
	
	
	/**
	 * 移动岗位到目标父岗位，根据用户权限先判断是否有权限在原机构下删除该岗位，
	 * 以及是否有权限在目标机构下增加一岗位
	 * @param userId 用户主键
	 * @param posId  岗位主键
	 * @param targetOrgId 要移动到的目标机构
	 * @return 是否成功移动岗位的提示信息
	 * */
	public ResultForm<Object> movePositionToOrg(Long adminUserId, Long posId, Long targetOrgId);

	/**
	 * 根据岗位主键列表获取所有的关联用户主键列表
	 * @param posIds 岗位主键列表
	 * @return  所有的关联用户主键列表
	 * */
	public List<Long> getUserIdsByPosIds(List<Long> posIds);

	/**
	 * 根据机构主键列表获取关联的岗位列表
	 * 
	 * @param orgIds
	 *            机构主键列表
	 * @return 岗位列表
	 */
	public List<Long> getPosIdsByOrgIds(List<Long> orgIds);
	
	
	/**
	 * 根据主键ID分页查询直属子岗位
	 * @param parentPosId 岗位对象主键
	 * @return 岗位对象主键的集合
	 */
	public Page<OmPositionForm> getChildPositions(Long parentPosId,Page<OmPositionForm> page);
	
	/**
	 * 根据岗位id获取岗位对象，包括扩展属性children,users
	 */
	public OmPositionForm getPosRelateElement(Long posId);
	
	/**
	 * 保存OmPositionForm，还要建立好它跟父岗位的关联
	 * */
	public void savePosCascade(OmPositionForm form);

	/**
	 * 获取所有的岗位OmPositionForm列表
	 */
	public List<OmPositionForm> getAll();
	
	/**
	 * 根据指定岗位数组获取对应的用户id数组
	 * @param posIds 岗位id数组
	 * @return 用户id数组
	 */
	public Long[] getUserIdsByPosIds(Long[] posIds);
	
	/**
	 * 删除用户在该机构下的岗位
	 * @param userId 用户主键
	 * @param orgId 机构主键
	 */
	public void deleteUserPosOfCurOrg(Long userId, Long orgId);
	
	/**
	 * 删除用户在该工作组下的岗位
	 * @param userId 用户主键
	 * @param groupId 工作组主键
	 */
	public void deleteUserPosOfCurGroup(Long userId, Long groupId);
	
	/**
	 * 根据posCode获取form对象
	 * @param posCode
	 * @return
	 */
	public OmPositionForm getByPosCode(String posCode);
	
	public boolean isOrgListPosLikeKeyword(List<OmOrgForm>orgList,String keyword);
	public boolean isPosLikeKeyword(Long posId,String keyword);
	
	//判断岗位表中是否有匹配的记录
	public boolean hasPosLikeKeyword(List<OmPositionForm>list,String keyword);
}
